package com.cqc.jdk8.Jlang.thread;


import static java.lang.Thread.sleep;

/**
 * DEMO: https://heuqqdmbyk.feishu.cn/wiki/MUL1wejrviNhsxklCwKcGk01nzh
 */
public class DeadlockTest {
    /**
     * 演示死锁产生的条件
     * 执行main方法后，发现没有结束，
     * 此时程序并没有结束，这种现象就是死锁现象...线程t1持有A的锁等待获取B锁，线程t2持有B的锁等待获取A的锁
     */
    public static void main(String[] args) {
        Object A = new Object();
        Object B = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (A) {
                System.out.println("...t1...lock A");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (B) {
                    System.out.println("...t1...lock B");
                    System.out.println("...t1...操作...");
                }
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
            synchronized (B) {
                System.out.println("...t2...lock B");
//                try {
                //可以注释掉。因为t1拿到了A锁，然后t1睡了1s，，这段时间t2已经拿到了B锁,当t2开始拿A锁的时候,发现t1持有A锁,就卡住了。
//                    sleep(500);
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
                synchronized (A) {
                    System.out.println("...t2...lock A");
                    System.out.println("...t2...操作...");
                }
            }
        }, "t2");
        t1.start();
        t2.start();
    }
}